﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.Windows.Controls;
using System.Drawing;
using System.IO;
using Common.Interfaces;
using System.Drawing.Imaging;
using System.Diagnostics;
using Common.Extensions;

namespace Common.Model
{
    [DataContract]
    public class CSpieler
    {
        private Bitmap _Bild;

        #region getter/setter

        [DataMember]
        public String Name { get; set; }

        [DataMember]
        public CSpielfeld.FieldColor Farbe { get; set; }

        public Bitmap Bild
        {
            get
            {
                return _Bild;
            }
            set
            {
                if (value == null)
                {
                    _Bild = null; 
                    return;
                }

                if (value.Width > 400 && value.Width >= value.Height)
                {
                    value = value.ResizeW(400);
                }

                if (value.Height > 400 && value.Height >= value.Width)
                {
                    value = value.ResizeH(400);
                }

                _Bild = value;
            }
        }

        /* bitmaps können nicht in xml(für server, wcf) und nicht in json(protokoll serialisiert werden.
         * Daher wird zwischenzeitlich ein byte-Array generiert.
         * Um Platz im Protokoll zu sparen, bzw. weniger Daten übertragen zu müssen wird anstatt des Standardbildes ein leeres byte-Array übergeben.
         */
        [DataMember]
        public byte[] BBild
        {
            get
            {
                if (!Bild.CompareTo(new Bitmap(Properties.Resources.defaultSpieler)))
                {
                    return Bild.AsBytes();
                }
                else
                {
                    return new byte[] { };
                }
            }
            set
            {
                if (value.Length <= 0) this.Bild = new Bitmap(Common.Properties.Resources.defaultSpieler);
                else this.Bild = BMPASByte.FromBytes(value);
            }
        }

        public int Punkte
        {
            get
            {
                try
                {
                    return CSpielfeld.Instance.AllPoints.Where((p) => CSpielfeld.Instance[p] == Farbe).Count();
                }
                catch (Exception e)
                {
#if DEBUG
                    Debug.Print(e.Message);
#endif
                    return 0;
                }
            }
        }

        #endregion

        #region konstruktor

        public CSpieler()
        {
            Name = "";
            Farbe = CSpielfeld.FieldColor.Black;
            Bild = new Bitmap(Common.Properties.Resources.defaultSpieler);
        }

        public CSpieler(CSpielfeld.FieldColor col, String name = "", Bitmap bild = null)
        {
            Name = name;
            Farbe = col;
            if (bild == null) Bild = new Bitmap(Common.Properties.Resources.defaultSpieler);
            else Bild = bild;
        }

        #endregion

        #region operator things

        public override bool Equals(object obj)
        {
            CSpieler sp;
            return obj != null && (obj.GetType() == this.GetType()) && (sp = obj as CSpieler) != null && this.Bild.CompareTo(sp.Bild) && this.Punkte == sp.Punkte && this.Name == sp.Name && this.Farbe == sp.Farbe;
        }

        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }
        #endregion

        public override string ToString()
        {
            return ToString(false);
        }
        public string ToString(bool familiar)
        {
            try
            {
                if (familiar)
                {
                    return Name + "(" + Farbe.ToString() + ")";
                }
                else
                {
                    return "CSpieler=[Name=" + Name + ", Farbe=" + Farbe.ToString() + ", Bild=" + (Bild == null ? "" : Bild.ToString()) + "]";
                }
            }
            catch (Exception)
            {
                return base.ToString();
            }
        }
    }
}
